//==========================================================================
// Copyright (c) 2000-2008,  Elastos, Inc.  All Rights Reserved.
//==========================================================================
#ifndef VJBSDHDR_H
#define VJBSDHDR_H

#include "lwip/tcp.h"

/*
 * Structure of an internet header, naked of options.
 *
 * We declare ip_len and ip_off to be short, rather than u_short
 * pragmatically since otherwise unsigned comparisons can result
 * against negative integers quite easily, and fail in subtle ways.
 */
PACK_STRUCT_BEGIN
struct ip
{
#if defined(NO_CHAR_BITFIELDS)
    u_char ip_hl_v; /* bug in GCC for mips means the bitfield stuff will sometimes break - so we use a char for both and get round it with macro's instead... */
#else
#if BYTE_ORDER == LITTLE_ENDIAN
    unsigned ip_hl:4,             /* header length */
        ip_v:4;                   /* version */
#elif BYTE_ORDER == BIG_ENDIAN
    unsigned ip_v:4,              /* version */
        ip_hl:4;                  /* header length */
#else
    COMPLAIN - NO Byte ORDER SELECTED!
#endif
#endif
    u_char ip_tos;                /* type of service */
    u_short ip_len;               /* total length */
    u_short ip_id;                /* identification */
    u_short ip_off;               /* fragment offset field */
#define IP_DF 0x4000              /* dont fragment flag */
#define IP_MF 0x2000              /* more fragments flag */
#define IP_OFFMASK 0x1fff         /* mask for fragmenting bits */
    u_char ip_ttl;                /* time to live */
    u_char ip_p;                  /* protocol */
    u_short ip_sum;               /* checksum */
    struct in_addr ip_src,ip_dst; /* source and dest address */
};
PACK_STRUCT_END

typedef u32_t tcp_seq;

/*
 * TCP header.
 * Per RFC 793, September, 1981.
 */
PACK_STRUCT_BEGIN
struct tcphdr
{
	u_short	th_sport;		/* source port */
	u_short	th_dport;		/* destination port */
	tcp_seq	th_seq;			/* sequence number */
	tcp_seq	th_ack;			/* acknowledgement number */
#if defined(NO_CHAR_BITFIELDS)
    u_char th_x2_off;
#else
#if BYTE_ORDER == LITTLE_ENDIAN
    unsigned th_x2:4,       /* (unused) */
            th_off:4;       /* data offset */
#endif
#if BYTE_ORDER == BIG_ENDIAN
    unsigned th_off:4,      /* data offset */
            th_x2:4;        /* (unused) */
#endif
#endif
    u_char th_flags;
    u_short th_win;         /* window */
    u_short th_sum;         /* checksum */
    u_short th_urp;         /* urgent pointer */
};
PACK_STRUCT_END

#endif /* VJBSDHDR_H */
